#include <iostream>

// 函数声明
int max(int num1, int num2);

// 指针调用
void swapz(int *x, int *y);

// 引用调用
void swapy(int &x, int &y);

// 函数定义
void swap(int x, int y)
{
    int temp;

    temp = x; /* 保存 x 的值 */
    x = y;    /* 把 y 赋值给 x */
    y = temp; /* 把 x 赋值给 y */

    return;
}

int main()
{

    std::cout << "////////// C++ 函数 //////////" << std::endl;
    // 局部变量声明
    int a = 100;
    int b = 200;
    int ret;

    // 调用函数来获取最大值
    ret = max(a, b);

    std::cout << "Max value is : " << ret << std::endl;

    std::cout << " C++ 传值调用 " << ret << std::endl;

    // 局部变量声明
    a = 100;
    b = 200;

    std::cout << "交换前，a 的值：" << a << std::endl;
    std::cout << "交换前，b 的值：" << b << std::endl;

    // 调用函数来交换值
    swap(a, b);

    std::cout << "交换后，a 的值：" << a << std::endl;
    std::cout << "交换后，b 的值：" << b << std::endl;

    std::cout << "虽然在函数内改变了 a 和 b 的值，但是实际上 a 和 b 的值没有发生变化 " << std::endl;

    std::cout << " C++ 指针调用 " << std::endl;

    a = 100;
    b = 200;

    std::cout << "交换前，a 的值：" << a << std::endl;
    std::cout << "交换前，b 的值：" << b << std::endl;

    /* 调用函数来交换值
     * &a 表示指向 a 的指针，即变量 a 的地址
     * &b 表示指向 b 的指针，即变量 b 的地址
     */
    swapz(&a, &b);

    std::cout << "交换后，a 的值：" << a << std::endl;
    std::cout << "交换后，b 的值：" << b << std::endl;
    std::cout << "指针调用就成功了" << b << std::endl;

    std::cout << "C++ 引用调用" << std::endl;

    // 局部变量声明
    a = 100;
    b = 200;

    std::cout << "交换前，a 的值：" << a << std::endl;
    std::cout << "交换前，b 的值：" << b << std::endl;

    /* 调用函数来交换值 */
    swap(a, b);

    std::cout << "交换后，a 的值：" << a << std::endl;
    std::cout << "交换后，b 的值：" << b << std::endl;

    return 0;
}

int max(int a, int b)
{
    if (a > b)
        return a;
    else
        return b;
}

// 函数定义
void swapz(int *x, int *y)
{
    int temp;
    temp = *x; /* 保存地址 x 的值 */
    *x = *y;   /* 把 y 赋值给 x */
    *y = temp; /* 把 x 赋值给 y */

    return;
}

// 函数定义
void swapy(int &x, int &y)
{
    int temp;
    temp = x; /* 保存地址 x 的值 */
    x = y;    /* 把 y 赋值给 x */
    y = temp; /* 把 x 赋值给 y  */

    return;
}